/** @file
    Provides simple log services to memory buffer.
**/

#ifndef __MEMLOG_LIB_H__
#define __MEMLOG_LIB_H__

//
// Mem log sizes
//
//#define MEM_LOG_INITIAL_SIZE    (128 * 1024)
#define MEM_LOG_INITIAL_SIZE    (64 * 1024)
#define MEM_LOG_MAX_SIZE        (2 * 1024 * 1024)
#define MEM_LOG_MAX_LINE_SIZE   1024

/** Callback that can be installed to be called when some message is printed with MemLog() or MemLogVA(). **/
typedef VOID (EFIAPI *MEM_LOG_CALLBACK) (IN INTN DebugMode, IN CHAR8 *LastMessage);

/**
  Prints a log message to memory buffer.

  @param  Timing      TRUE to prepend timing to log.
  @param  DebugMode   DebugMode will be passed to Callback function if it is set.
  @param  Format      The format string for the debug message to print.
  @param  Marker      VA_LIST with variable arguments for Format.

**/
VOID
EFIAPI
MemLogVA (
  IN  CONST BOOLEAN     Timing,
  IN  CONST INTN        DebugMode,
  IN  CONST CHAR8       *Format,
  IN        VA_LIST     Marker
);

/**
  Prints a log message to memory buffer.

  If Format is NULL, then does nothing.

  @param  Timing      TRUE to prepend timing to log.
  @param  DebugMode   DebugMode will be passed to Callback function if it is set.
  @param  Format      The format string for the debug message to print.
  @param  ...         The variable argument list whose contents are accessed
                      based on the format string specified by Format.

**/
VOID
EFIAPI
MemLog (
  IN  CONST BOOLEAN   Timing,
  IN  CONST INTN      DebugMode,
  IN  CONST CHAR8     *Format,
  ...
);

/**
  Returns pointer to MemLog buffer.
**/
CHAR8 *
EFIAPI
GetMemLogBuffer ();

/**
  Returns the length of log (number of chars written) in mem buffer.
 **/
UINTN
EFIAPI
GetMemLogLen ();

/**
  Sets callback that will be called when message is added to mem log.
 **/
VOID
EFIAPI
SetMemLogCallback (
  MEM_LOG_CALLBACK  Callback
);

/**
  Returns TSC ticks per second.
 **/
UINT64
EFIAPI
GetMemLogTscTicksPerSecond ();

#endif // __MEMLOG_LIB_H__
